﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once
#include "GcmpModelInterface.h"

namespace gcmp
{
    class IDocument;
    class IElement;
    class IModelView;
    class IElementImportOption;
    class ICopyStrategyReporter;

    typedef void FuncCopyStrategyFilter(const IElement*, ICopyStrategyReporter*);

    class GCMP_MODEL_INTERFACE_EXPORT IElementsImport
    {
    public:

        /*!
        *@brief      创建成组的导入对象;
        *@author     zhangkai;
        *@date       2021年08月25日
        *@return     返回创建的对象;
        */
        static gcmp::OwnerPtr<IElementsImport> Create();
        
        /*!
        *@brief      成组导入接口;
        *@author     zhangkai;
        *@date       2021年08月25日
        *@param[in]  const gcmp::IDocument* pOpenDocument 打开的文档
        *@param[in]  const std::vector<gcmp::ElementId>& importElements 导入的elements的ID
        *@param[in]  gcmp::IDocument* pDestDocument 目标文档
        *@param[in]  const IModelView* pCurrentModelView 当前视图，创建组时使用;
        *@param[in]  FuncCopyStrategyFilter funcElementsFilter CopyStrategyReporter中保存了当前element依赖的对象，对这些对象可以进行过滤;
        *@param[in]  gcmp::IElementImportOption* pImportOption 导入选项
        *@return     bool 导入成功或者失败;
        */
        virtual bool ImportToDocument(gcmp::IDocument* pOpenDocument, const std::vector<gcmp::ElementId>& importElements,
            gcmp::IDocument* pDestDocument, const IModelView* pCurrentModelView, FuncCopyStrategyFilter funcElementsFilter, gcmp::IElementImportOption* pImportOption) = 0;

        /// \brief 主线程通过此接口结束导入过程。仅适用于多线程导入的情况，如在主线程内导入则主线程无法结束导入过程。
        /// \return 
        virtual void Terminate() = 0;

        /*!
        *@brief      获取导入后Element ID的映射关系;
        *@author     zhangkai;
        *@date       2021年09月15日
        *@return     返回映射关系;
        */
        virtual const std::unordered_map<ElementId, ElementId, ElementIdHash>& GetImportElementsOldNewIdMap() const = 0;
    };
}
